package haha.life.normal;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

/**
 * Description:json文件处理类
 *
 * @author cy
 * @date: 2020-10-22 13:36
 * @Version 1.1
 */
public class DealJsonUtils {
    /**
     * 读取json文件
     *
     * @param fileName 文件名
     * @return
     */
    public static String readJsonFile(String fileName) {
        String jsonStr = "";
        InputStream  inputStream  =  DealJsonUtils.class.getClassLoader().getResourceAsStream("static/" + fileName);

        try (Reader reader = new InputStreamReader(inputStream, "utf-8")) {
            int ch = 0;
            StringBuffer sb = new StringBuffer();
            while ((ch = reader.read()) != -1) {
                sb.append((char) ch);
            }
            jsonStr = sb.toString();
            return jsonStr;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据文件名  得到每一级分类的下属分类的数量
     *
     * @param file 文件名
     * @return map  key为当点分类  value为包含的下一级分类的数量
     */
    public static Map analysisArray(String file) {
        String s = readJsonFile(file);
        Map<Object, Integer> map = new HashMap<>();
        JSONArray jsonArray = (JSONArray) JSON.parse(s);
        for (int i = 0; i < jsonArray.size(); i++) {    //最外层
            JSONArray one = jsonArray.getJSONArray(i).getJSONArray(2);//一级导航
            map.put(jsonArray.getJSONArray(i).get(0), one.size());  //存放一级分类导航编码 和下面二级导航数量
            for (int j = 0; j < one.size(); j++) { //遍历第一层
                JSONArray two = one.getJSONArray(j).getJSONArray(2);  //二级导航
                map.put(one.getJSONArray(j).get(0), two.size());  //存放二级分类导航编码 和下面三级导航数量
            }
        }
        return map;
    }

    /**
     * 根据数据库名称  获取对应的文件名
     *
     * @param DBName 数据库名
     * @return
     */
    public static String getFileNameByDBName(String DBName) {
        String fileName = "";
        String s = readJsonFile("db.json");
        JSONArray jsonArray = (JSONArray) JSON.parse(s);
        for (int i = 0; i < jsonArray.size(); i++) {
            Map map = jsonArray.getJSONObject(i);
            if (DBName.equals(map.get("dbCode"))) {
                fileName = (String) map.get("classifyType") + ".json";
                break;
            }
        }
        return fileName;

    }

    /**
     * 得到子分类的数量
     *
     * @param DBName  数据库名称
     * @param keyName 当前分类编码
     * @return 子分类的数量 如果没有返回null
     */
    public static Integer getNavigationOfSonNum(String DBName, String keyName) {
        //获取DB对应的文件名
        String fileName = getFileNameByDBName(DBName);
        return (Integer) analysisArray(fileName).get(keyName);
    }


    /**
     * 根据库名 得到他的一级分类数量
     *
     * @param DBName 数据库名称
     * @return 一级分类数量
     */
    public static Integer getDBSonNum(String DBName) {
        //获取DB对应的文件名
        String fileName = getFileNameByDBName(DBName);
        Map<Object, Integer> map = new HashMap<>();
        //中标
        if ("classify_zbfl.json".equals(fileName)) {
            JSONArray jsonArray = (JSONArray) JSON.parse(readJsonFile(fileName));
            for (int i = 0; i < jsonArray.size(); i++) {    //最外层
                JSONArray one = jsonArray.getJSONArray(i).getJSONArray(2);//一级导航
                map.put(jsonArray.getJSONArray(i).get(0), one.size());  //存放一级分类导航编码 和下面二级导航数量
            }
        } else {
            JSONArray jsonArray = (JSONArray) JSON.parse(readJsonFile(fileName));
            for (int q = 0; q < jsonArray.size(); q++) {
                map.put(jsonArray.getJSONArray(q).get(0), jsonArray.getJSONArray(q).size() / 2);
            }
        }
        return map.size();
    }

    /**
     * 根据dbCode获取数据库是否开放
     *
     * @param DBName 数据库编码
     * @return 是否开放
     */
    public static Boolean isOpen(String DBName) {
        boolean bl = false;
        String jsonStr = DealJsonUtils.readJsonFile("db.json");
        JSONArray jsonArray = (JSONArray) JSON.parse(jsonStr);
        for (int i = 0; i < jsonArray.size(); i++) {
            Map map = jsonArray.getJSONObject(i);
            if (DBName.equals(map.get("dbCode"))) {
                bl = (boolean) map.get("isOpen");
                break;
            }
        }
        return bl;
    }

}



